package com.practice.lambda;

import com.practice.lambda.entity.Employee;
import com.practice.stream.entity.Trader;
import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/*
 *方法引用：若Lambda体中的内容有方法已经实现了，我们可以使用“方法引用"
 *（可以理解为方法引用是Lambda表式的另外一种表现形式）
 *主要有三种语法格式：
 * 1. 对象：：实例方法名
 * 2. 类：：静态方法名
 * 3. 类：：实例方法名
 *
 * * 使用方法引用要求以下一致
 * 1. 参数列表
 * 2。 返回值
 *
 * 构造器引用
 * 类名::new
 *
 *
 */
public class MethodRef {
    /**
     * Consumer<T>接口
     * <p>
     * 类：：实例方法名
     */
    @Test
    public void test1() {
        final Consumer<String> stringConsumer = (x) -> System.out.println(x);
        stringConsumer.accept("origin implement");

        final Consumer<String> stringConsumer1 = System.out::println;
        stringConsumer1.accept("method-ref implement");
    }

    /**
     * Supplier<T>接口
     * <p>
     * 对象：：实例方法名
     */
    @Test
    public void test2() {
        final Trader trader = new Trader("Luck", "Sweden");
        Supplier<String> sup = () -> trader.getName();
        final String str1 = sup.get();
        System.out.println(str1);

        final Supplier<String> sup2 = trader::getName;
        final String str2 = sup2.get();
        System.out.println(str2);

    }

    /**
     * Comparator<T>接口
     * <p>
     * 类：：静态方法名
     */
    @Test
    public void test3() {
        Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);

        Comparator<Integer> com2 = Integer::compare;
    }

    /**
     * 第一个对象的方法调用，
     * 第二个对象是第一个对象调用时传入的参数
     */

    @Test
    public void test4() {
        BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);

        BiPredicate<String, String> biPredicate2 = String::equals;

    }

    /**
     * 构造器引用
     */
    @Test
    public void test5() {
        Supplier<Trader> supplier=Trader::new;
        System.out.println(supplier.get());


        Function<Integer,Integer[]> function= Integer[]::new;
        final Integer[] integers = function.apply(3);
        System.out.println(Arrays.toString(integers));

    }

}
